﻿Imports System.ComponentModel

Public Class BeheerLeveringsbonnenForm

    Private _mainForm As Form

#Region "Public property's"

    Private _kanWijzigen As Boolean
    Public Property KanWijzigen() As Boolean
        Get
            Return _kanWijzigen
        End Get
        Set(ByVal value As Boolean)
            _kanWijzigen = value
            tsbWijzigen.Enabled = value
        End Set
    End Property

    Private _kanVerwijderen As Boolean
    Public Property KanVerwijderen() As Boolean
        Get
            Return _kanVerwijderen
        End Get
        Set(ByVal value As Boolean)
            _kanVerwijderen = value
            tsbVerwijderen.Enabled = value
            BindingNavigatorDeleteItem.Enabled = value
        End Set
    End Property

    Private _kanBewaren As Boolean
    Public Property KanBewaren() As Boolean
        Get
            Return _kanBewaren
        End Get
        Set(ByVal value As Boolean)
            _kanBewaren = value
            tsbBewaren.Enabled = value
            'BindingNavigatorSaveItem.Enabled = value
        End Set
    End Property

#End Region

#Region "Constructor en initialisatie"

    Public Sub New(ByVal mainForm As Form)
        Me.InitializeComponent()
        _mainForm = mainForm
    End Sub

    Protected Overrides Sub OnLoad(ByVal e As EventArgs)
        MyBase.OnLoad(e)
        Try
            Me.WinkeliersBindingSource.DataSource = Utility.Data
            Me.VerkoopsoortenBindingSource.DataSource = Utility.Data
            Me.KlantenBindingSource.DataSource = Utility.Data
            Me.LeveringsbonnenBindingSource.DataSource = Utility.Data
            Me.LeveringsbonnenBindingSource.Filter = "IdSoort=" & Constants.VerkoopsoortIds.FACTUUR.ToString()
            Me.LeveringsbonnenBindingSource.Sort = "IsFactuurBehandeld ASC, ID DESC"

            InitGrid()

            KanBewaren = False
            KanVerwijderen = False
        Catch ex As Exception
            MsgBox.ShowError("Ophalen data is mislukt")
            log.WriteError("BeheerLeveringsbonnenForm.OnLoad", ex)
        End Try
    End Sub
#End Region

#Region "Events"

    Protected Overrides Sub OnKeyUp(ByVal e As KeyEventArgs)
        MyBase.OnKeyUp(e)
        Select Case e.KeyCode
            Case Keys.F12
                Me.Close()
            Case Keys.F5
                Me.BeheerLeveringsbon(LeveringsbonnenGrid.SelectedRows(0).Index)
        End Select
    End Sub

    Private Sub tsbBewaren_Click(ByVal sender As Object, ByVal e As EventArgs)
        BewaarWijzigingen()
    End Sub

    Private Sub tsbSluiten_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbSluiten.Click
        Me.Close()
    End Sub

    Private Sub LeveringsbonnenGrid_CellDoubleClick(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles LeveringsbonnenGrid.CellDoubleClick
        Me.BeheerLeveringsbon(e.RowIndex)
    End Sub

    Private Sub tsbWijzigFactuur_Click(ByVal sender As Object, ByVal e As EventArgs) Handles tsbWijzigen.Click
        If Me.LeveringsbonnenGrid.SelectedRows.Count > 0 Then
            Me.BeheerLeveringsbon(LeveringsbonnenGrid.SelectedRows(0).Index)
        Else
            MessageBox.Show("Gelieve eerst een rij te selecteren")
        End If
    End Sub

    Private Sub LeveringsbonnenGrid_SelectionChanged(ByVal sender As Object, ByVal e As EventArgs) Handles LeveringsbonnenGrid.SelectionChanged
        Dim kanBeheren As Boolean = Security.IsAdmin() OrElse Security.IsWinkelwerking
        KanWijzigen = (kanBeheren AndAlso LeveringsbonnenGrid.SelectedRows.Count > 0)
        KanVerwijderen = False
        If (kanBeheren AndAlso LeveringsbonnenGrid.SelectedRows.Count > 0) Then
            Dim row As DataGridViewRow = LeveringsbonnenGrid.Rows(LeveringsbonnenGrid.SelectedRows(0).Index)
            If (row.DataBoundItem IsNot Nothing) Then
                Dim drv As DataRowView = DirectCast(row.DataBoundItem, DataRowView)
                If (drv IsNot Nothing) Then ' bijvoorbeeld bij lege rij onderaan
                    Dim verkoopRow As ArtikelsDataSet.VerkopenRow = DirectCast(drv.Row, ArtikelsDataSet.VerkopenRow)
                    If (verkoopRow.AantalDetails = 0) Then ' werkt niet de eerste keer
                        ' Alleen verkopen zonder details eraan gekoppeld kunnen verwijderd worden
                        KanVerwijderen = True
                    End If
                End If
            End If
        End If
    End Sub

    Private Sub LeveringsbonnenGrid_DataError(ByVal sender As Object, ByVal e As DataGridViewDataErrorEventArgs) Handles LeveringsbonnenGrid.DataError
        MsgBox.ShowError("Ongeldige invoer. Bij een wijziging, druk Esc om de vorige waarde te herstellen")
        log.WriteError("BeheerLeveringsbonnenForm.LeveringsbonnenGrid_DataError", e.Exception)
        e.Cancel = True
    End Sub

    Private Sub LeveringsbonnenGrid_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As EventArgs) Handles LeveringsbonnenGrid.CurrentCellDirtyStateChanged
        If LeveringsbonnenGrid.IsCurrentCellDirty Then
            KanBewaren = True
        End If
    End Sub

    Private Sub LeveringsbonnenGrid_CellFormatting(ByVal sender As Object, ByVal e As DataGridViewCellFormattingEventArgs) _
            Handles LeveringsbonnenGrid.CellFormatting
        Dim row As DataGridViewRow = LeveringsbonnenGrid.Rows(e.RowIndex)
        Dim verkopenRow As ArtikelsDataSet.VerkopenRow = DataGridViewHelper.GetDataRowFromDataGridViewRow(Of ArtikelsDataSet.VerkopenRow)(row)

        Select Case verkopenRow.IsFactuurBehandeld
            Case True
                e.CellStyle.BackColor = Constants.Kleuren.HUIDIG
            Case False
                e.CellStyle.BackColor = Constants.Kleuren.AFGEREKEND
        End Select
    End Sub

    Protected Overrides Sub OnClosing(ByVal e As CancelEventArgs)
        MyBase.OnClosing(e)
        If (Not Me.Validate()) Then
            e.Cancel = True
            Return
        End If
        Me.LeveringsbonnenBindingSource.EndEdit()
        If (Utility.Data.HasChanges()) Then
            Dim result As DialogResult = MessageBox.Show("Deze leveringsbon bevat wijzigingen. Wil je de wijzigingen bewaren?", "Bewaren", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Exclamation)
            Select Case result
                Case Windows.Forms.DialogResult.Yes
                    BewaarWijzigingen()
                Case Windows.Forms.DialogResult.Cancel
                    e.Cancel = True
                    Return
                Case Windows.Forms.DialogResult.No
                    Utility.Data.RejectChanges()
                    ' gewoon laten sluiten
            End Select
        End If
        ' We have to dispose of the grid before the form closes to avoid possible DataErrors from the GridViewComboBoxColumn
        Me.LeveringsbonnenGrid.Dispose()
        _mainForm.BringToFront()
    End Sub

#End Region

#Region "Helpers"

    Private Sub InitGrid()
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.IdColumn.ColumnName, Me.LeveringsbonnenGrid)
            .HeaderText = "N°"
            .Width = 50
            .DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.IsFactuurBehandeldColumn.ColumnName, Me.LeveringsbonnenGrid)
            .HeaderText = "Factuur gemaakt"
            .Width = 150
            .SortMode = DataGridViewColumnSortMode.Automatic
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.IdKlantColumn.ColumnName, Me.LeveringsbonnenGrid)
            .HeaderText = "Klant"
            Dim column As DataGridViewComboBoxColumn = DirectCast(DataGridViewHelper.GetGridColumnByDataName _
                (Utility.Data.Verkopen.IdKlantColumn.ColumnName, LeveringsbonnenGrid), DataGridViewComboBoxColumn)
            column.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing ' verberg de uitklappijl
            .Width = 180
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.IdWinkelierColumn.ColumnName, Me.LeveringsbonnenGrid)
            .HeaderText = "Winkelier"
            Dim column As DataGridViewComboBoxColumn = DirectCast(DataGridViewHelper.GetGridColumnByDataName _
                (Utility.Data.Verkopen.IdWinkelierColumn.ColumnName, LeveringsbonnenGrid), DataGridViewComboBoxColumn)
            column.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing ' verberg de uitklappijl
        End With
        With DataGridViewHelper.GetGridColumnByDataName(Utility.Data.Verkopen.ConsignatieColumn.ColumnName, Me.LeveringsbonnenGrid)
            .HeaderText = "Consignatie"
        End With
    End Sub

    Private Sub BeheerLeveringsbon(ByVal rowIndex As Integer)
        If (rowIndex < 0) Then Return ' bv. dubbelklikken op header
        Try
            Cursor = Cursors.WaitCursor
            Dim gridRow As DataGridViewRow = LeveringsbonnenGrid.Rows(rowIndex)
            Dim datarow As DataRowView = DirectCast(gridRow.DataBoundItem, DataRowView)
            If (datarow Is Nothing) Then Return ' bijvoorbeeld bij dubbelklikken op lege rij onderaan
            Dim verkopenRow As ArtikelsDataSet.VerkopenRow = CType(datarow.Row, ArtikelsDataSet.VerkopenRow)

            Dim f As New LeveringsbonDetailsForm(Me, verkopenRow)
            If (f.ShowDialog() = Windows.Forms.DialogResult.OK) Then
                ' update grid gaat vanzelf
                ' TODO: eventueel aantal verkoopsDetails tonen
            End If
        Catch ex As Exception
            MsgBox.ShowError(ex.ToString + "Fout tijdens het wijzigen van de leveringsbon")
            log.WriteError("BeheerLeveringsbonnenForm.BeheerLeveringsbon", ex)
        Finally
            Cursor = Cursors.Default
        End Try
    End Sub

    Private Function BewaarWijzigingen() As Integer
        '    Try
        '        Cursor = Cursors.WaitCursor
        '        If (Not Me.Validate()) Then Return 0
        '        Me.VerkopenBindingSource.EndEdit()

        '        Dim aantalToegevoegd As Integer = 0
        '        Dim aantalVerwijderd As Integer = 0
        '        Dim aantalGewijzigd As Integer = 0

        '        For i As Integer = Me.ArtikelsDataSet1.Verkopen.Count - 1 To 0 Step -1
        '            ' achterstevoren omdat aantal verkopen kan veranderen tijdens de lus
        '            Dim row As ArtikelsDataSet.VerkopenRow = Me.ArtikelsDataSet1.Verkopen(i)
        '            Select Case row.RowState
        '                Case DataRowState.Added
        '                    aantalToegevoegd += 1
        '                    Dal.VerkoopToevoegen(row)
        '                Case DataRowState.Deleted
        '                    aantalVerwijderd += 1
        '                    ' TODO: verwijderen samen met details
        '                Case DataRowState.Modified
        '                    aantalGewijzigd += 1
        '            End Select
        '        Next
        '        Dim aantal As Integer = Me.VerkopenTableAdapter1.Update(Me.ArtikelsDataSet1)
        '        'Dim msg As String = String.Format("{0} verko(oop(en) werd aangepast.{1}{2} verko(oop(en) werden toegevoegd.{3}{4} verko(oop(en) werden verwijderd.", _
        '        '    aantalGewijzigd, Environment.NewLine, aantalToegevoegd, Environment.NewLine, aantalVerwijderd)
        '        'MessageBox.Show(msg, "Bewaren", MessageBoxButtons.OK, MessageBoxIcon.Information)
        '        KanBewaren = False
        '        Return aantal + aantalToegevoegd
        '    Catch ex As Exception
        '        log.WriteError("VerkopenForm.BewaarWijzigingen", ex)
        '        If (ex.ToString.Contains("VerkoopsDetails")) Then
        '            MsgBox.ShowError("Er werd mogelijk geprobeerd verkopen met details te verwijderen. Dit gaat niet. De wijzigingen worden ongedaan gemaakt.")
        '            Me.ArtikelsDataSet1.Verkopen.RejectChanges()
        '        Else
        '            MsgBox.ShowError("Fout tijdens het bewaren")
        '        End If
        '    Finally
        '        Cursor = Cursors.Default
        '    End Try
        '    Return 0
    End Function

#End Region


End Class